<?php

/**
 * Winbinder Tree 
 * 
 * @package php.ui.winbinder.tree
 */


/**
 * WBTreeNode
 * 
 * @package php.ui.winbinder.tree
 */

class WBTreeNode extends WBObject { 
	
	const NODETYPE_CHILD = 2;
	const NODETYPE_SIBLING = 1;
	
	private $_tree = null;
	private $_instance = null;
	
	/**
	 * 생성자
	 * 
	 * @param array $options
	 */
	public function __construct($options = array()) { 
		parent::__construct($options);
		
		$this->initComponent();
	}
	
	public function initComponent() { 
		if (isset($this->instance)) $this->setInstance($this->getOption('instance'));
		if (isset($this->tree)) $this->_tree = $this->getOption('tree');
	}

	/**
	 * 자식노드 생성 
	 * 
	 * @param array $opt
	 * @return WBTreeNode
	 */
	public function createChild($opt = array()) { 

		$opt['type'] = self::NODETYPE_CHILD;
		$opt['where'] = $this->getInstance();

		return $this->_tree->createNode($opt);
	}

	/**
	 * 형제 노드 생성
	 * 
	 * @param array $opt
	 * @return WBTreeNode
	 */
	public function createSibling($opt = array()) { 
		$opt['type'] = self::NODETYPE_SIBLING;
		$opt['where'] = $this->getInstance();

		return $this->_tree->createNode($opt);
	}

	/**
	 * 마지막 자식 노드 여부 
	 * 
	 * @return bool
	 */
	public function isLeaf() { 
		return ($this->_tree->getItemCount() > 0) ? false : true;
	}

	/**
	 * 최초 레벨 여부 
	 * 
	 * @return bool
	 */
	public function isRoot() { 
		return ($this->getLevel() == 1);
	}

	/**
	 * TreeNode 의 Level (depth) 얻어오기 
	 * 
	 * @return int
	 */
	public function getLevel() { 
		return $this->_tree->getLevel($this->getInstance());
	}

	/**
	 * 상위 노드 얻어오기 
	 * 
	 * @return WBTreeNode
	 */
	public function getParent() { 
		return new WBTreeNode(array(
			'tree' => $this->_tree, 
			'instance' => $this->_tree->getParent($this->getInstance())
		));
	}

	public function getInstance() { 
		return $this->_instance;
	}

	public function setInstance($instance) { 
		$this->_instance = $instance;
	}

	/**
	 * 해당 노드의 text 를 얻어온다. 
	 * 
	 * @return string
	 */
	public function getText() { 
		return $this->_tree->getText($this->getInstance());
	}

	/**
	 * 해당 노드의 text 를 설정한다. 
	 * 
	 * @param string $text
	 * @return bool
	 */
	public function setText($text) { 
		return $this->_tree->setText($text, $this->getInstance());
	}

	/**
	 * 펼침 여부 
	 * 
	 * @return bool
	 */
	public function isExpanded() { 
		return ( $this->_tree->getState($this->getInstance()) == 1 );
	}

	/**
	 * 펼치기
	 * 
	 */
	public function expand() { 
		$this->_tree->setState($this->getInstance(), true);
	}

	/**
	 * 모으기 
	 * 
	 */
	public function collapse() { 
		$this->_tree->setState($this->getInstance(), false);
	}

	/**
	 * node 가 selected 되어지면 parent 노드는 자동으로 expand 된다. 
	 *
	 * @param bool $isSelect  선택 여부 지정 
	 */
	public function select($isSelect = true) { 
		$this->_tree->setSelected($this->getInstance(), $isSelect);
	}

	/**
	 * 현재 노드를 삭제한다. 
	 * 
	 * @return bool
	 */
	public function delete() { 
		return $this->_tree->deleteItems($this->getInstance());
	}

	/**
	 * 현재 선택된 노드의 값을 얻어온다. 
	 * 
	 * tree 에서 선택된 값만 가지고 올 수 있음. 
	 * 따라서 select(true) 를 시킨다음 getValue() 해서 가지고 와야 실제 node 의 값을 가지고 올 수 있다. 
	 * 
	 * @return string
	 */	
	public function getValue() { 
		return $this->_tree->getValue($this->getInstance());
	}

	/**
	 * TreeNode 이미지 설정 
	 * 
	 * TreeView 에 지정된 이미지에서 노드 이미지를 지정한다. 
	 * 
	 * @param int $imageindex  이미지 인덱스 
	 * @return bool
	 */
	public function setImage($imageindex) { 
		return $this->_tree->setItemImage($imageindex, $this->getInstance());
	}

}

?>